source('../settings/settings.R')
source('commonFunctions.R')
persons <- SELECTED_SUBJECTS

all_Drive2 <- read.csv('..//data/processed/distancewise/TT1_Drive_2_30m_30m.csv')
all_Drive2$Subject <- as.factor(all_Drive2$Subject)
all_Drive2$logPerspiration <- log(all_Drive2$Perspiration)
mean_pp <- vector(mode="list", length=length(persons)) 
names(mean_pp) <- persons

std_pp <- vector(mode="list", length=length(persons)) 
names(std_pp) <- persons

# Segments
mean_pp_seg0 <- vector(mode="list", length=length(persons)) 
names(mean_pp_seg0) <- persons
mean_pp_seg1 <- vector(mode="list", length=length(persons)) 
names(mean_pp_seg1) <- persons
mean_pp_seg2 <- vector(mode="list", length=length(persons)) 
names(mean_pp_seg2) <- persons
mean_pp_seg3 <- vector(mode="list", length=length(persons)) 
names(mean_pp_seg3) <- persons
mean_pp_seg4 <- vector(mode="list", length=length(persons)) 
names(mean_pp_seg4) <- persons
mean_pp_max <- vector(mode="list", length=length(persons)) 
names(mean_pp_max) <- persons

std_pp_seg0 <- vector(mode="list", length=length(persons)) 
names(std_pp_seg0) <- persons
std_pp_seg1 <- vector(mode="list", length=length(persons)) 
names(std_pp_seg1) <- persons
std_pp_seg2 <- vector(mode="list", length=length(persons)) 
names(std_pp_seg2) <- persons
std_pp_seg3 <- vector(mode="list", length=length(persons)) 
names(std_pp_seg3) <- persons
std_pp_seg4 <- vector(mode="list", length=length(persons)) 
names(std_pp_seg4) <- persons
std_pp_max <- vector(mode="list", length=length(persons)) 
names(std_pp_max) <- persons


for(p in persons) {
  pData <- all_Drive2[(all_Drive2$Subject==as.integer(p) | all_Drive2$Subject==p),]
  pData_act2 <- pData[pData$Activity==2,]
  
  pData_seg0 <- pData[pData$Phase==0,]
  pData_seg1 <- pData[pData$Phase==1 & pData$Activity==2 & pData$Time < 110,]
  pData_seg2 <- pData[pData$Phase==2 & pData$Activity==2 & pData$Time < 250,]
  pData_seg3 <- pData[pData$Phase==3 & pData$Activity==2 & pData$Time < 350,]
  pData_seg4 <- pData[pData$Phase==4 & pData$Activity==2,]
  
  mean_pp[[p]] <- mean(pData_act2$ppLogNormalized)
  std_pp[[p]] <- sd(pData$ppLogNormalized)
  
  mean_pp_seg0[[p]] <- mean(pData_seg0$ppLogNormalized)
  mean_pp_seg1[[p]] <- mean(pData_seg1$ppLogNormalized)
  mean_pp_seg2[[p]] <- mean(pData_seg2$ppLogNormalized)
  mean_pp_seg3[[p]] <- mean(pData_seg3$ppLogNormalized)
  mean_pp_seg4[[p]] <- mean(pData_seg4$ppLogNormalized)
  mean_pp_max[[p]] <- max(mean_pp_seg1[[p]], mean_pp_seg2[[p]], mean_pp_seg3[[p]], mean_pp_seg4[[p]])
  
  std_pp_seg0[[p]] <- sd(pData_seg0$ppLogNormalized)
  std_pp_seg1[[p]] <- sd(pData_seg1$ppLogNormalized)
  std_pp_seg2[[p]] <- sd(pData_seg2$ppLogNormalized)
  std_pp_seg3[[p]] <- sd(pData_seg3$ppLogNormalized)
  std_pp_seg4[[p]] <- sd(pData_seg4$ppLogNormalized)
  std_pp_max[[p]] <- max(std_pp_seg1[[p]], std_pp_seg2[[p]], std_pp_seg3[[p]], std_pp_seg4[[p]])
}
plt_AllAcc <- vector(mode="list", length=length(persons)) 
names(plt_AllAcc) <- persons

COLOR_ACC = "#02A3C8"
COLOR_PP = "#F28E8E"
COLOR_BRAKE = "#888888"

y1 <- list(
  tickfont = list(color = COLOR_ACC),
  title="Degree",
  range=c(0, max(all_Drive2$Acceleration))
)
y2 <- list(
  tickfont = list(color = COLOR_PP),
  overlaying = "y",
  side = "right",
  title = "Log Perspiration",
  showgrid = FALSE,
  range=c(-0.6, 0.9)
  # range=c(min(all_Drive2$ppLogNormalized), max(all_Drive2$ppLogNormalized))
)

for (p in persons) {
  pData <- all_Drive2[(all_Drive2$Subject==as.integer(p) | all_Drive2$Subject==p),]
  
  pData_seg0 <- pData[pData$Phase==0,]
  pData_seg1 <- pData[pData$Phase==1 & pData$Activity==2 & pData$Time < 110,]
  pData_seg2 <- pData[pData$Phase==2 & pData$Activity==2 & pData$Time < 250,]
  pData_seg3 <- pData[pData$Phase==3 & pData$Activity==2 & pData$Time < 350,]
  pData_seg4 <- pData[pData$Phase==4 & pData$Activity==2,]
  
  plot_Acc <- plot_ly(pData, x = ~Time, height=400, width=900) %>%
    # add_trace(name="Acceleration", y = ~Acceleration, type = 'scatter', mode = 'lines', line=list(width=1.5, color=COLOR_ACC)) %>% 
    add_trace(name="PP", y = ~ppLogNormalized, type = 'scatter', mode = 'lines', connectgaps=F, line=list(width=1.5, color=COLOR_PP), yaxis = "y2") %>%
    add_segments(x = min(pData$Time), xend = max(pData$Time), y = mean_pp[[p]], yend = mean_pp[[p]],
                           yaxis = "y2", name="Avg. PP (straight)",
                           line=list(color="darkgray", dash = 'dot')) %>%
    add_segments(x = min(pData$Time), xend = max(pData$Time), y = mean_pp_seg0[[p]], yend = mean_pp_seg0[[p]], 
                           yaxis = "y2", name="Avg. PP (turning)",
                           line=list(color="black", dash = 'dot')) %>%
    add_segments(x = min(pData_seg1$Time), xend = max(pData_seg1$Time), y = mean_pp_seg1[[p]], yend = mean_pp_seg1[[p]], 
                           yaxis = "y2", name="Avg. PP (1st part)",
                           line=list(color="red", dash = 'dot')) %>%
    add_segments(x = min(pData_seg2$Time), xend = max(pData_seg2$Time), y = mean_pp_seg2[[p]], yend = mean_pp_seg2[[p]], 
                           yaxis = "y2", name="Avg. PP (2nd part)",
                           line=list(color="green", dash = 'dot')) %>%
    add_segments(x = min(pData_seg3$Time), xend = max(pData_seg3$Time), y = mean_pp_seg3[[p]], yend = mean_pp_seg3[[p]], 
                           yaxis = "y2", name="Avg. PP (3rd part)",
                           line=list(color="blue", dash = 'dot')) %>%
    add_segments(x = min(pData_seg4$Time), xend = max(pData_seg4$Time), y = mean_pp_seg4[[p]], yend = mean_pp_seg4[[p]], 
                           yaxis = "y2", name="Avg. PP (4th part)",
                           line=list(color="purple", dash = 'dot')) %>%
    layout(
      title=paste0("Subject #", p), 
      xaxis=list(title="Time [s]", range=c(0)), 
      yaxis=y1, 
      yaxis2=y2, 
      margin = list(l = 50, r = 50, b = 50, t = 50, pad = 4),
      legend = list(x = 0.5, xanchor = "center", y = 0.2, bgcolor = "rgba(0,0,0,0)", title="Metric", orientation = "h"),
      autosize = F
    )
  
  plt_AllAcc[[p]] <- plot_Acc
}


htmltools::tagList(plt_AllAcc)
NUMBER_OF_CLUSTERS = 3

color_darkpink = "#e75480"
CLUSTER_BRANCH_COLORS <- c("blue", "darkred", color_darkpink, "black")[1:NUMBER_OF_CLUSTERS]
CLUSTER_LABEL_COLORS <- c("blue", "darkred", color_darkpink, "black")[1:NUMBER_OF_CLUSTERS]


dfPP <- as.data.frame(cbind(
                            unlist(mean_pp), 
                            unlist(std_pp), 
                            unlist(mean_pp_seg0), 
                            unlist(mean_pp_seg1), 
                            unlist(mean_pp_seg2), 
                            unlist(mean_pp_seg3), 
                            unlist(mean_pp_seg4),
                            unlist(mean_pp_max),
                            unlist(std_pp_seg0), 
                            unlist(std_pp_seg1), 
                            unlist(std_pp_seg2), 
                            unlist(std_pp_seg3), 
                            unlist(std_pp_seg4),
                            unlist(std_pp_max)
              ))

names(dfPP) <- c("MeanPP", "StdPP", 
                 "MeanPP_Seg0", "MeanPP_Seg1", "MeanPP_Seg2", "MeanPP_Seg3", "MeanPP_Seg4", "MeanPP_SegMax",
                 "StdPP_Seg0", "StdPP_Seg1", "StdPP_Seg2", "StdPP_Seg3", "StdPP_Seg4", "StdPP_SegMax")
behavioralMatrixClustering <- as.matrix(dfPP)

distMatrix <- dist(behavioralMatrixClustering)
hresults <- distMatrix %>% hclust

hc <- hresults %>% 
      as.dendrogram %>%
      set("nodes_cex", NUMBER_OF_CLUSTERS) %>%
      set("labels_col", value = CLUSTER_LABEL_COLORS, k=NUMBER_OF_CLUSTERS) %>%
      # set("leaves_pch", 19) %>%
      # set("leaves_col", value = c("gray"), k=NUMBER_OF_CLUSTERS) %>%    
      set("branches_k_color", value=CLUSTER_BRANCH_COLORS, k=NUMBER_OF_CLUSTERS)

plot(hc)
legend("topright", 
     title="Drive=Cognitive \nHierachical Clustering",
     legend = c("Group 1", "Group 2", "Group 3"),
     col = c("darkred", "pink" , "blue"),
     pch = c(20,20,20), bty = "n",  pt.cex = 1.5, cex = 0.8 , 
     text.col = "black", horiz = FALSE, inset = c(0.4, 0.1))

# Store clustering data
fPath <- str_interp("../data/processed/analysis/TT1_Drive_2_PP.csv")
dfx <- dfPP
dfx <- cbind(persons, dfx)
names(dfx) <- c("Subject", names(dfPP))
write.csv(dfx, fPath, row.names = F)
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CnNvdXJjZSgnLi4vc2V0dGluZ3Mvc2V0dGluZ3MuUicpCnNvdXJjZSgnY29tbW9uRnVuY3Rpb25zLlInKQpgYGAKCmBgYHtyfQpwZXJzb25zIDwtIFNFTEVDVEVEX1NVQkpFQ1RTCgphbGxfRHJpdmUyIDwtIHJlYWQuY3N2KCcuLi8vZGF0YS9wcm9jZXNzZWQvZGlzdGFuY2V3aXNlL1RUMV9Ecml2ZV8yXzMwbV8zMG0uY3N2JykKYWxsX0RyaXZlMiRTdWJqZWN0IDwtIGFzLmZhY3RvcihhbGxfRHJpdmUyJFN1YmplY3QpCmFsbF9Ecml2ZTIkbG9nUGVyc3BpcmF0aW9uIDwtIGxvZyhhbGxfRHJpdmUyJFBlcnNwaXJhdGlvbikKYGBgCgoKYGBge3J9Cm1lYW5fcHAgPC0gdmVjdG9yKG1vZGU9Imxpc3QiLCBsZW5ndGg9bGVuZ3RoKHBlcnNvbnMpKSAKbmFtZXMobWVhbl9wcCkgPC0gcGVyc29ucwoKc3RkX3BwIDwtIHZlY3Rvcihtb2RlPSJsaXN0IiwgbGVuZ3RoPWxlbmd0aChwZXJzb25zKSkgCm5hbWVzKHN0ZF9wcCkgPC0gcGVyc29ucwoKIyBTZWdtZW50cwptZWFuX3BwX3NlZzAgPC0gdmVjdG9yKG1vZGU9Imxpc3QiLCBsZW5ndGg9bGVuZ3RoKHBlcnNvbnMpKSAKbmFtZXMobWVhbl9wcF9zZWcwKSA8LSBwZXJzb25zCm1lYW5fcHBfc2VnMSA8LSB2ZWN0b3IobW9kZT0ibGlzdCIsIGxlbmd0aD1sZW5ndGgocGVyc29ucykpIApuYW1lcyhtZWFuX3BwX3NlZzEpIDwtIHBlcnNvbnMKbWVhbl9wcF9zZWcyIDwtIHZlY3Rvcihtb2RlPSJsaXN0IiwgbGVuZ3RoPWxlbmd0aChwZXJzb25zKSkgCm5hbWVzKG1lYW5fcHBfc2VnMikgPC0gcGVyc29ucwptZWFuX3BwX3NlZzMgPC0gdmVjdG9yKG1vZGU9Imxpc3QiLCBsZW5ndGg9bGVuZ3RoKHBlcnNvbnMpKSAKbmFtZXMobWVhbl9wcF9zZWczKSA8LSBwZXJzb25zCm1lYW5fcHBfc2VnNCA8LSB2ZWN0b3IobW9kZT0ibGlzdCIsIGxlbmd0aD1sZW5ndGgocGVyc29ucykpIApuYW1lcyhtZWFuX3BwX3NlZzQpIDwtIHBlcnNvbnMKbWVhbl9wcF9tYXggPC0gdmVjdG9yKG1vZGU9Imxpc3QiLCBsZW5ndGg9bGVuZ3RoKHBlcnNvbnMpKSAKbmFtZXMobWVhbl9wcF9tYXgpIDwtIHBlcnNvbnMKCnN0ZF9wcF9zZWcwIDwtIHZlY3Rvcihtb2RlPSJsaXN0IiwgbGVuZ3RoPWxlbmd0aChwZXJzb25zKSkgCm5hbWVzKHN0ZF9wcF9zZWcwKSA8LSBwZXJzb25zCnN0ZF9wcF9zZWcxIDwtIHZlY3Rvcihtb2RlPSJsaXN0IiwgbGVuZ3RoPWxlbmd0aChwZXJzb25zKSkgCm5hbWVzKHN0ZF9wcF9zZWcxKSA8LSBwZXJzb25zCnN0ZF9wcF9zZWcyIDwtIHZlY3Rvcihtb2RlPSJsaXN0IiwgbGVuZ3RoPWxlbmd0aChwZXJzb25zKSkgCm5hbWVzKHN0ZF9wcF9zZWcyKSA8LSBwZXJzb25zCnN0ZF9wcF9zZWczIDwtIHZlY3Rvcihtb2RlPSJsaXN0IiwgbGVuZ3RoPWxlbmd0aChwZXJzb25zKSkgCm5hbWVzKHN0ZF9wcF9zZWczKSA8LSBwZXJzb25zCnN0ZF9wcF9zZWc0IDwtIHZlY3Rvcihtb2RlPSJsaXN0IiwgbGVuZ3RoPWxlbmd0aChwZXJzb25zKSkgCm5hbWVzKHN0ZF9wcF9zZWc0KSA8LSBwZXJzb25zCnN0ZF9wcF9tYXggPC0gdmVjdG9yKG1vZGU9Imxpc3QiLCBsZW5ndGg9bGVuZ3RoKHBlcnNvbnMpKSAKbmFtZXMoc3RkX3BwX21heCkgPC0gcGVyc29ucwoKCmZvcihwIGluIHBlcnNvbnMpIHsKICBwRGF0YSA8LSBhbGxfRHJpdmUyWyhhbGxfRHJpdmUyJFN1YmplY3Q9PWFzLmludGVnZXIocCkgfCBhbGxfRHJpdmUyJFN1YmplY3Q9PXApLF0KICBwRGF0YV9hY3QyIDwtIHBEYXRhW3BEYXRhJEFjdGl2aXR5PT0yLF0KICAKICBwRGF0YV9zZWcwIDwtIHBEYXRhW3BEYXRhJFBoYXNlPT0wLF0KICBwRGF0YV9zZWcxIDwtIHBEYXRhW3BEYXRhJFBoYXNlPT0xICYgcERhdGEkQWN0aXZpdHk9PTIgJiBwRGF0YSRUaW1lIDwgMTEwLF0KICBwRGF0YV9zZWcyIDwtIHBEYXRhW3BEYXRhJFBoYXNlPT0yICYgcERhdGEkQWN0aXZpdHk9PTIgJiBwRGF0YSRUaW1lIDwgMjUwLF0KICBwRGF0YV9zZWczIDwtIHBEYXRhW3BEYXRhJFBoYXNlPT0zICYgcERhdGEkQWN0aXZpdHk9PTIgJiBwRGF0YSRUaW1lIDwgMzUwLF0KICBwRGF0YV9zZWc0IDwtIHBEYXRhW3BEYXRhJFBoYXNlPT00ICYgcERhdGEkQWN0aXZpdHk9PTIsXQogIAogIG1lYW5fcHBbW3BdXSA8LSBtZWFuKHBEYXRhX2FjdDIkcHBMb2dOb3JtYWxpemVkKQogIHN0ZF9wcFtbcF1dIDwtIHNkKHBEYXRhJHBwTG9nTm9ybWFsaXplZCkKICAKICBtZWFuX3BwX3NlZzBbW3BdXSA8LSBtZWFuKHBEYXRhX3NlZzAkcHBMb2dOb3JtYWxpemVkKQogIG1lYW5fcHBfc2VnMVtbcF1dIDwtIG1lYW4ocERhdGFfc2VnMSRwcExvZ05vcm1hbGl6ZWQpCiAgbWVhbl9wcF9zZWcyW1twXV0gPC0gbWVhbihwRGF0YV9zZWcyJHBwTG9nTm9ybWFsaXplZCkKICBtZWFuX3BwX3NlZzNbW3BdXSA8LSBtZWFuKHBEYXRhX3NlZzMkcHBMb2dOb3JtYWxpemVkKQogIG1lYW5fcHBfc2VnNFtbcF1dIDwtIG1lYW4ocERhdGFfc2VnNCRwcExvZ05vcm1hbGl6ZWQpCiAgbWVhbl9wcF9tYXhbW3BdXSA8LSBtYXgobWVhbl9wcF9zZWcxW1twXV0sIG1lYW5fcHBfc2VnMltbcF1dLCBtZWFuX3BwX3NlZzNbW3BdXSwgbWVhbl9wcF9zZWc0W1twXV0pCiAgCiAgc3RkX3BwX3NlZzBbW3BdXSA8LSBzZChwRGF0YV9zZWcwJHBwTG9nTm9ybWFsaXplZCkKICBzdGRfcHBfc2VnMVtbcF1dIDwtIHNkKHBEYXRhX3NlZzEkcHBMb2dOb3JtYWxpemVkKQogIHN0ZF9wcF9zZWcyW1twXV0gPC0gc2QocERhdGFfc2VnMiRwcExvZ05vcm1hbGl6ZWQpCiAgc3RkX3BwX3NlZzNbW3BdXSA8LSBzZChwRGF0YV9zZWczJHBwTG9nTm9ybWFsaXplZCkKICBzdGRfcHBfc2VnNFtbcF1dIDwtIHNkKHBEYXRhX3NlZzQkcHBMb2dOb3JtYWxpemVkKQogIHN0ZF9wcF9tYXhbW3BdXSA8LSBtYXgoc3RkX3BwX3NlZzFbW3BdXSwgc3RkX3BwX3NlZzJbW3BdXSwgc3RkX3BwX3NlZzNbW3BdXSwgc3RkX3BwX3NlZzRbW3BdXSkKfQoKYGBgCgpgYGB7cn0KcGx0X0FsbEFjYyA8LSB2ZWN0b3IobW9kZT0ibGlzdCIsIGxlbmd0aD1sZW5ndGgocGVyc29ucykpIApuYW1lcyhwbHRfQWxsQWNjKSA8LSBwZXJzb25zCgpDT0xPUl9BQ0MgPSAiIzAyQTNDOCIKQ09MT1JfUFAgPSAiI0YyOEU4RSIKQ09MT1JfQlJBS0UgPSAiIzg4ODg4OCIKCnkxIDwtIGxpc3QoCiAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gQ09MT1JfQUNDKSwKICB0aXRsZT0iRGVncmVlIiwKICByYW5nZT1jKDAsIG1heChhbGxfRHJpdmUyJEFjY2VsZXJhdGlvbikpCikKeTIgPC0gbGlzdCgKICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBDT0xPUl9QUCksCiAgb3ZlcmxheWluZyA9ICJ5IiwKICBzaWRlID0gInJpZ2h0IiwKICB0aXRsZSA9ICJMb2cgUGVyc3BpcmF0aW9uIiwKICBzaG93Z3JpZCA9IEZBTFNFLAogIHJhbmdlPWMoLTAuNiwgMC45KQogICMgcmFuZ2U9YyhtaW4oYWxsX0RyaXZlMiRwcExvZ05vcm1hbGl6ZWQpLCBtYXgoYWxsX0RyaXZlMiRwcExvZ05vcm1hbGl6ZWQpKQopCgpmb3IgKHAgaW4gcGVyc29ucykgewogIHBEYXRhIDwtIGFsbF9Ecml2ZTJbKGFsbF9Ecml2ZTIkU3ViamVjdD09YXMuaW50ZWdlcihwKSB8IGFsbF9Ecml2ZTIkU3ViamVjdD09cCksXQogIAogIHBEYXRhX3NlZzAgPC0gcERhdGFbcERhdGEkUGhhc2U9PTAsXQogIHBEYXRhX3NlZzEgPC0gcERhdGFbcERhdGEkUGhhc2U9PTEgJiBwRGF0YSRBY3Rpdml0eT09MiAmIHBEYXRhJFRpbWUgPCAxMTAsXQogIHBEYXRhX3NlZzIgPC0gcERhdGFbcERhdGEkUGhhc2U9PTIgJiBwRGF0YSRBY3Rpdml0eT09MiAmIHBEYXRhJFRpbWUgPCAyNTAsXQogIHBEYXRhX3NlZzMgPC0gcERhdGFbcERhdGEkUGhhc2U9PTMgJiBwRGF0YSRBY3Rpdml0eT09MiAmIHBEYXRhJFRpbWUgPCAzNTAsXQogIHBEYXRhX3NlZzQgPC0gcERhdGFbcERhdGEkUGhhc2U9PTQgJiBwRGF0YSRBY3Rpdml0eT09MixdCiAgCiAgcGxvdF9BY2MgPC0gcGxvdF9seShwRGF0YSwgeCA9IH5UaW1lLCBoZWlnaHQ9NDAwLCB3aWR0aD05MDApICU+JQogICAgIyBhZGRfdHJhY2UobmFtZT0iQWNjZWxlcmF0aW9uIiwgeSA9IH5BY2NlbGVyYXRpb24sIHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbGluZXMnLCBsaW5lPWxpc3Qod2lkdGg9MS41LCBjb2xvcj1DT0xPUl9BQ0MpKSAlPiUgCiAgICBhZGRfdHJhY2UobmFtZT0iUFAiLCB5ID0gfnBwTG9nTm9ybWFsaXplZCwgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdsaW5lcycsIGNvbm5lY3RnYXBzPUYsIGxpbmU9bGlzdCh3aWR0aD0xLjUsIGNvbG9yPUNPTE9SX1BQKSwgeWF4aXMgPSAieTIiKSAlPiUKICAgIGFkZF9zZWdtZW50cyh4ID0gbWluKHBEYXRhJFRpbWUpLCB4ZW5kID0gbWF4KHBEYXRhJFRpbWUpLCB5ID0gbWVhbl9wcFtbcF1dLCB5ZW5kID0gbWVhbl9wcFtbcF1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICB5YXhpcyA9ICJ5MiIsIG5hbWU9IkF2Zy4gUFAgKHN0cmFpZ2h0KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU9bGlzdChjb2xvcj0iZGFya2dyYXkiLCBkYXNoID0gJ2RvdCcpKSAlPiUKICAgIGFkZF9zZWdtZW50cyh4ID0gbWluKHBEYXRhJFRpbWUpLCB4ZW5kID0gbWF4KHBEYXRhJFRpbWUpLCB5ID0gbWVhbl9wcF9zZWcwW1twXV0sIHllbmQgPSBtZWFuX3BwX3NlZzBbW3BdXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHlheGlzID0gInkyIiwgbmFtZT0iQXZnLiBQUCAodHVybmluZykiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lPWxpc3QoY29sb3I9ImJsYWNrIiwgZGFzaCA9ICdkb3QnKSkgJT4lCiAgICBhZGRfc2VnbWVudHMoeCA9IG1pbihwRGF0YV9zZWcxJFRpbWUpLCB4ZW5kID0gbWF4KHBEYXRhX3NlZzEkVGltZSksIHkgPSBtZWFuX3BwX3NlZzFbW3BdXSwgeWVuZCA9IG1lYW5fcHBfc2VnMVtbcF1dLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgeWF4aXMgPSAieTIiLCBuYW1lPSJBdmcuIFBQICgxc3QgcGFydCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lPWxpc3QoY29sb3I9InJlZCIsIGRhc2ggPSAnZG90JykpICU+JQogICAgYWRkX3NlZ21lbnRzKHggPSBtaW4ocERhdGFfc2VnMiRUaW1lKSwgeGVuZCA9IG1heChwRGF0YV9zZWcyJFRpbWUpLCB5ID0gbWVhbl9wcF9zZWcyW1twXV0sIHllbmQgPSBtZWFuX3BwX3NlZzJbW3BdXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHlheGlzID0gInkyIiwgbmFtZT0iQXZnLiBQUCAoMm5kIHBhcnQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZT1saXN0KGNvbG9yPSJncmVlbiIsIGRhc2ggPSAnZG90JykpICU+JQogICAgYWRkX3NlZ21lbnRzKHggPSBtaW4ocERhdGFfc2VnMyRUaW1lKSwgeGVuZCA9IG1heChwRGF0YV9zZWczJFRpbWUpLCB5ID0gbWVhbl9wcF9zZWczW1twXV0sIHllbmQgPSBtZWFuX3BwX3NlZzNbW3BdXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHlheGlzID0gInkyIiwgbmFtZT0iQXZnLiBQUCAoM3JkIHBhcnQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZT1saXN0KGNvbG9yPSJibHVlIiwgZGFzaCA9ICdkb3QnKSkgJT4lCiAgICBhZGRfc2VnbWVudHMoeCA9IG1pbihwRGF0YV9zZWc0JFRpbWUpLCB4ZW5kID0gbWF4KHBEYXRhX3NlZzQkVGltZSksIHkgPSBtZWFuX3BwX3NlZzRbW3BdXSwgeWVuZCA9IG1lYW5fcHBfc2VnNFtbcF1dLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgeWF4aXMgPSAieTIiLCBuYW1lPSJBdmcuIFBQICg0dGggcGFydCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lPWxpc3QoY29sb3I9InB1cnBsZSIsIGRhc2ggPSAnZG90JykpICU+JQogICAgbGF5b3V0KAogICAgICB0aXRsZT1wYXN0ZTAoIlN1YmplY3QgIyIsIHApLCAKICAgICAgeGF4aXM9bGlzdCh0aXRsZT0iVGltZSBbc10iLCByYW5nZT1jKDApKSwgCiAgICAgIHlheGlzPXkxLCAKICAgICAgeWF4aXMyPXkyLCAKICAgICAgbWFyZ2luID0gbGlzdChsID0gNTAsIHIgPSA1MCwgYiA9IDUwLCB0ID0gNTAsIHBhZCA9IDQpLAogICAgICBsZWdlbmQgPSBsaXN0KHggPSAwLjUsIHhhbmNob3IgPSAiY2VudGVyIiwgeSA9IDAuMiwgYmdjb2xvciA9ICJyZ2JhKDAsMCwwLDApIiwgdGl0bGU9Ik1ldHJpYyIsIG9yaWVudGF0aW9uID0gImgiKSwKICAgICAgYXV0b3NpemUgPSBGCiAgICApCiAgCiAgcGx0X0FsbEFjY1tbcF1dIDwtIHBsb3RfQWNjCn0KCgpodG1sdG9vbHM6OnRhZ0xpc3QocGx0X0FsbEFjYykKYGBgCgoKYGBge3J9Ck5VTUJFUl9PRl9DTFVTVEVSUyA9IDMKCmNvbG9yX2RhcmtwaW5rID0gIiNlNzU0ODAiCkNMVVNURVJfQlJBTkNIX0NPTE9SUyA8LSBjKCJibHVlIiwgImRhcmtyZWQiLCBjb2xvcl9kYXJrcGluaywgImJsYWNrIilbMTpOVU1CRVJfT0ZfQ0xVU1RFUlNdCkNMVVNURVJfTEFCRUxfQ09MT1JTIDwtIGMoImJsdWUiLCAiZGFya3JlZCIsIGNvbG9yX2RhcmtwaW5rLCAiYmxhY2siKVsxOk5VTUJFUl9PRl9DTFVTVEVSU10KCgpkZlBQIDwtIGFzLmRhdGEuZnJhbWUoY2JpbmQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QobWVhbl9wcCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KHN0ZF9wcCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KG1lYW5fcHBfc2VnMCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KG1lYW5fcHBfc2VnMSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KG1lYW5fcHBfc2VnMiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KG1lYW5fcHBfc2VnMyksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KG1lYW5fcHBfc2VnNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QobWVhbl9wcF9tYXgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KHN0ZF9wcF9zZWcwKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3Qoc3RkX3BwX3NlZzEpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubGlzdChzdGRfcHBfc2VnMiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KHN0ZF9wcF9zZWczKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3Qoc3RkX3BwX3NlZzQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KHN0ZF9wcF9tYXgpCiAgICAgICAgICAgICAgKSkKCm5hbWVzKGRmUFApIDwtIGMoIk1lYW5QUCIsICJTdGRQUCIsIAogICAgICAgICAgICAgICAgICJNZWFuUFBfU2VnMCIsICJNZWFuUFBfU2VnMSIsICJNZWFuUFBfU2VnMiIsICJNZWFuUFBfU2VnMyIsICJNZWFuUFBfU2VnNCIsICJNZWFuUFBfU2VnTWF4IiwKICAgICAgICAgICAgICAgICAiU3RkUFBfU2VnMCIsICJTdGRQUF9TZWcxIiwgIlN0ZFBQX1NlZzIiLCAiU3RkUFBfU2VnMyIsICJTdGRQUF9TZWc0IiwgIlN0ZFBQX1NlZ01heCIpCmJlaGF2aW9yYWxNYXRyaXhDbHVzdGVyaW5nIDwtIGFzLm1hdHJpeChkZlBQKQoKZGlzdE1hdHJpeCA8LSBkaXN0KGJlaGF2aW9yYWxNYXRyaXhDbHVzdGVyaW5nKQpocmVzdWx0cyA8LSBkaXN0TWF0cml4ICU+JSBoY2x1c3QKCmhjIDwtIGhyZXN1bHRzICU+JSAKICAgICAgYXMuZGVuZHJvZ3JhbSAlPiUKICAgICAgc2V0KCJub2Rlc19jZXgiLCBOVU1CRVJfT0ZfQ0xVU1RFUlMpICU+JQogICAgICBzZXQoImxhYmVsc19jb2wiLCB2YWx1ZSA9IENMVVNURVJfTEFCRUxfQ09MT1JTLCBrPU5VTUJFUl9PRl9DTFVTVEVSUykgJT4lCiAgICAgICMgc2V0KCJsZWF2ZXNfcGNoIiwgMTkpICU+JQogICAgICAjIHNldCgibGVhdmVzX2NvbCIsIHZhbHVlID0gYygiZ3JheSIpLCBrPU5VTUJFUl9PRl9DTFVTVEVSUykgJT4lICAgIAogICAgICBzZXQoImJyYW5jaGVzX2tfY29sb3IiLCB2YWx1ZT1DTFVTVEVSX0JSQU5DSF9DT0xPUlMsIGs9TlVNQkVSX09GX0NMVVNURVJTKQoKcGxvdChoYykKbGVnZW5kKCJ0b3ByaWdodCIsIAogICAgIHRpdGxlPSJEcml2ZT1Db2duaXRpdmUgXG5IaWVyYWNoaWNhbCBDbHVzdGVyaW5nIiwKICAgICBsZWdlbmQgPSBjKCJHcm91cCAxIiwgIkdyb3VwIDIiLCAiR3JvdXAgMyIpLAogICAgIGNvbCA9IGMoImRhcmtyZWQiLCAicGluayIgLCAiYmx1ZSIpLAogICAgIHBjaCA9IGMoMjAsMjAsMjApLCBidHkgPSAibiIsICBwdC5jZXggPSAxLjUsIGNleCA9IDAuOCAsIAogICAgIHRleHQuY29sID0gImJsYWNrIiwgaG9yaXogPSBGQUxTRSwgaW5zZXQgPSBjKDAuNCwgMC4xKSkKYGBgCgoKCmBgYHtyfQojIFN0b3JlIGNsdXN0ZXJpbmcgZGF0YQpmUGF0aCA8LSBzdHJfaW50ZXJwKCIuLi9kYXRhL3Byb2Nlc3NlZC9hbmFseXNpcy9UVDFfRHJpdmVfMl9QUC5jc3YiKQpkZnggPC0gZGZQUApkZnggPC0gY2JpbmQocGVyc29ucywgZGZ4KQpuYW1lcyhkZngpIDwtIGMoIlN1YmplY3QiLCBuYW1lcyhkZlBQKSkKd3JpdGUuY3N2KGRmeCwgZlBhdGgsIHJvdy5uYW1lcyA9IEYpCmBgYAoKCgo=